All Articles

ラビットチャレンジ Stage 3 〜深層学習:前編〜 受講ノート | INPUT/THINKING/OUTPUT

「ラビットチャレンジ Stage 3 〜深層学習:前編〜」について

「ラビットチャレンジ Stage 3 〜深層学習:前編〜」をおすすめしている人

「ラビットチャレンジ Stage 3 〜深層学習:前編〜」メモ

機械学習モデルを入力・出力の目的で分類したもの

  • 識別モデル: データを目的のクラスに分類する

    • 条件"あるデータxが与えられた"という条件のもとでクラスCkである確率
    • モデル
    • 決定木
    • ロジスティック回帰
    • サポートベクターマシン
    • ニューラルネットワーク
    • 特徴
    • 高次元→低次元
    • 必要な学習データが少ない
    • 応用例
    • 画像認識
  • 生成モデル: 特定のクラスのデータを生成する

    • 条件"あるクラスyに属する"という条件のもとでデータCkの分布
    • モデル
    • 隠れマルコフモデル
    • ベイジアンネットワーク
    • 変分オートエンコーダー
    • 敵対的生成ネットワーク
    • 特徴
    • 低次元→高次元
    • 必要な学習データが多い
    • 応用例
    • 画像の超解像
    • テキスト生成

識別器

  • 生成モデル

    • 識別の計算にベイズの定理を用いる
    • モデル化の対象は、各クラスの生起確率やデータのクラス条件付き密度
    • 特徴: データを人工的に生成できる。確率的な識別
  • 識別モデル(確率的識別モデル)

    • 決定論に基づき識別結果を得る
    • モデル化の対象は、データがクラスに属する確率
    • 確率的な識別
    • アプローチ: 入力データから事後確率を推論し、推論された事後確率から識別結果を決定する
  • 識別関数(決定的識別モデル)

    • 入力値xを直接クラスに写像する関数f(x)を推定
    • データの属するクラスの情報のみ(確率は計算されない)
    • 学習量が少ない
    • 決定的な識別
    • アプローチ: 入力データから識別結果を一気に得る。

識別器における生成モデルと識別モデル

データの分布は分類結果より複雑なことがある。生成モデルはこれを推定する。

  • データのクラス条件付き密度は分類結果より複雑→生成モデルはこの分布を推定する。計算量が多い
  • 単に分類結果を得るのであれば、直越データがクラスに属する確率を求める。→分類モデルのアプローチ

万能近似定理の深さ

ざっくり、ニューラルネットワークを使うことで、どんな関数でも近似可能になること。

ニューラルネットワーク

Q: ディープラーニングは何をしようとしているのか? A: 明示的なプログラムの代わりに多数の中間層を持つニューラルネットワークを用いて、入力値から目的とする出力値に変換する数学モデルを構築すること Q: 最適化の最終目的 A: 重みとバイアス

ニューラルネットワークでできること

  • 回帰

    • 結果予想
    • 売上予想
    • 株価予想
    • ランキング
    • 競馬順位予想
    • 人気順位予想
  • 分類

    • 猫写真の判別
    • 手書き文字認識
    • 花の種類分類
  • 実用例

    • 自動売買
    • チャットボット
    • 翻訳
    • 音声解釈
    • 囲碁、将棋AI

活性化関数

NNにおいて、次の層への出力の大きさを決める非線形の関数。 入力値の値によって、次の層への信号のON/OFFや強弱を定める働きを持つ。

  • 線形: 加法性と斉次性を満たす
  • 非線形: 加法性と斉次性を満たさない

活性化関数

  • 中間層用の活性化関数

    • ReLU関数
    • 勾配消失問題・スパース化に貢献することで良い成果をもたらす
    • 今最も使われている活性化関数
    • シグモイド関数(ロジスティック)
    • 0~1の間を緩やかに変化する関数
    • 勾配消失問題を引き起こす
    • 予想NN普及のきっかけとなった
    • ステップ関数: 閾値を超えたら発火する関数。
    • 現在では使われない。
    • 線形分離の問題でしか使えない。
  • 出力層用の活性化関数

    • ソフトマックス関数
    • 恒等写像
    • シグモイド関数(ロジスティック)
    • 誤差関数

  • 分類問題: クロスエントロピー誤差
  • 回帰問題: 平均二乗誤差

出力層の活性化関数

信号の大きさはそのまま変換 分類問題の場合、出力層の出力は0~1の範囲に限定し、総和を1とする必要がある

  • 回帰

    • 活性化関数: 恒等写像
    • 誤差関数: 二乗誤差
  • 二値分類

    • 活性化関数: シグモイド関数
    • 誤差関数: 交差エントロピー
  • 多クラス分類

    • 活性化関数: ソフトマックス関数
    • 誤差関数: 交差エントロピー

シグモイド関数

def sigmoid(x):
  return 1 / (1 + np.exp(-x))

ソフトマックス関数

def softmax(x):
    if x.ndim == 2:
        x = x.T
        x = x - np.max(x, axis=0)
        y = np.exp(x) / np.sum(np.exp(x), axis=0)
        return y.T

    x = x - np.max(x) # オーバーフロー対策
    return np.exp(x) / np.sum(np.exp(x))

平均二乗誤差

def mean_squared_error(d, y):
    return np.mean(np.square(d - y)) / 2

クロスエントロピー

分類問題で非常によく使う誤差関数

def cross_entropy_error(d, y):
    if y.ndim == 1:
        d = d.reshape(1, d.size)
        y = y.reshape(1, y.size)

    # 教師データがone-hot-vectorの場合、正解ラベルのインデックスに変換
    if d.size == y.size:
        d = d.argmax(axis=1)

    batch_size = y.shape[0]
    return -np.sum(np.log(y[np.arange(batch_size), d] + 1e-7)) / batch_size

勾配降下法

勾配降下法を利用してパラメータを最適化する。 誤差をどのくらい取り入れるかを学習率で制御する。 学習率が大きすぎた場合、最小値にいつまでもたどり着かず発散してしまう。 学習率が小さい場合、発散することはないが、小さすぎると収束するまでに時間がかかってしまう。

次回の重み = 今回の重み - 学習率 * 今回の重みでの誤差

勾配降下法の学習率の決定、収束性向上のためのアルゴリズム

  • Momentum
  • AdaGrad
  • Adadelta
  • Adam

確率的勾配降下法(SGD)

全データから一部分だけを使って学習を行う。 ランダムに抽出したサンプルの誤差 メリット

  • データが冗長な場合の計算コストの軽減
  • 望まない局所極小解に収束するリスクの軽減
  • オンライン学習ができる:

    • 学習データが入ってくるたびに都度パラメータを更新し、学習を進めていく方法。

ミニバッチ勾配降下法

バッチ学習にオンライン学習の考え方を導入した手法 バッチ学習の大量データに対応するためにデータを分割して学習に利用する。 ランダムに分割したデータの集合(ミニバッチ)に属するサンプルの平均誤差 メリット

  • 確率的勾配降下法のメリットを損なわず、計算機の計算資源を有効利用できる
  • CPUを利用したスレッド並列化やGPUを利用したSIMD並列化

誤差勾配の計算

数値微分を使って計算できるが、順伝播の計算を繰り返し行う必要があり負荷が大きい。 そこで、誤差逆伝播法を利用する

誤差逆伝播法

算出された誤差を、出力層側から順に微分し、前の層へと伝播。 最小限の計算で各パラメータでの微分値を解析的に計算する手法

 ディープラーニングの開発環境

  • ローカル

    • CPU
    • GPU - 並列処理
  • クラウド

    • AWS
    • GCP

入力層の設計

入力層として取るべきでないデータ

  • 欠損値が多いデータ

    • ゼロで詰める
    • 欠損値を含む集合を除外
    • 入力として採用しない
  • 誤差の大きいデータ
  • 出力そのもの、出力を加工した情報
  • 連続性のないデータ
  • 無意味な数が割り当てられているデータ 数値の正規化・正則化
  • 正規化: 最大値で割る
  • 正則化:

過学習

テストデータに対して過度に学習が進み、汎用性を失うこと。 入力値のデータ数が少なく、ニューラルネットワークが大きいときに起こりやすい

  • 過学習の原因: 重みが大きい値をとることで、過学習が発生することがある。
  • 過学習の検知: テスト誤差と訓練誤差の乖離をチェックすることで過学習の有無を発見できる
  • 過学習の解決策: 誤差に対して、正則化項を加算することで、重みを抑制する

    • パラメータ正則化: ネットワークの自由度(層数, ノード数, パラメータの値…)を削ぐことで過学習を抑制する
    • L1正則化: ラッソ回帰、p1ノルム(マンハッタン距離)を使う
    • L2正則化: リッジ回帰、p2ノルム(ユーグリッド距離)を使う
    • 正則化レイヤー
    • ドロップアウト: ランダムにノードを削除して学習させる。データ量はそのままで、より疎なモデルで学習することで過学習を抑制
    • 正規化レイヤー: レイヤー間を流れるデータの分布を、何らかの単位で平均が0、分散が1になるように正規化する。
    • Batch正規化: ミニバッチ単位で正規化
    • Layer正規化: チャンネルで正規化
    • Instance正規化: 各チャンネルで正規化
  • 実現例

    • Elastic Net: L1、L2正則化を組み合わせたもの

CNN

次元間で繋がりのあるデータを扱える データ例

  • 一次元

    • 音声(時刻, 強度)
    • アニメのスケルトン(時刻,(腕の値, 膝の値, …))
  • 二次元

    • フーリエ変換した音声(時刻, 周波数, 強度)
    • カラー画像(x, y, (R,G,B))
  • 三次元

    • CTスキャン画像(x, y, z, 強度)
    • 動画(時刻, x, y, (R,G,B))
  • 構成

    • 入力層
    • 畳み込み層: 画像の場合、縦横チャンネルの三次元のデータをそのまま学習し、次に伝えることができる。
    • 三次元の空間情報も学習できるような層が畳み込み層である。
    • 入力されたデータに対して、フィルタを使い畳み込みを行う
    • フィルター: 全結合でいう重み
    • プーリング層
    • 全結合層
  • 実装例

    • LeNet

RNN

時系列データに対応可能な、ニューラルネットワークである。 時系列データ: 時間的順序を追って一定間隔ごとに観察され、しかも相互に統計的依存関係が認められるようなデータの系列 学習の対象

  • 入力値から中間層を定義する際にかけられる重み
  • 中間層から出力値を定義する際にかけられる重み
  • 過去値から中間層を定義する際にかけられる重み
  • BPTT: RNNにおいてのパラメータ
  • 誤差関数をW(in)、W(out)、Wの三つの重みでそれぞれ微分する必要がある。
  • RNNの課題: 時系列を遡れば遡るほど、勾配が消失していく。

    • LSTM: 構造自体を変えて解決
  • 勾配爆発: 勾配が、層を逆伝播するごとに指数関数的に大きくなっていきます。

LSTM

  • CEC: それまでの入力値や中間層の出力値を記憶している

    • 勾配消失及び勾配爆発の解決方法として、勾配が、1であれば解決できる。
    • 記憶しかしない。
    • 課題: 入力データについて、時間依存度に関係なく重みが一律である。
    • ニューラルネットワークの学習特性がないということ。
    • 記憶することしかできないので、CECの周りに学習できる層を配置する。
  • 入力ゲートと出力ゲート: 入力・出力ゲートを追加することで、それぞれのゲートへの入力値の重みを、重み行列W,Uで可変可能とする。

    • 入力ゲート: CECが記憶するデータをどのようなデータを記憶させるかを学習するゲート
    • 出力ゲート: CECが記憶するデータをどのように利用するかを学習するゲート
  • 忘却ゲート: 過去の情報が要らなくなった場合、そのタイミングで情報を忘却する。
  • 覗き穴結合: CEC自身の値に、重み行列を介して伝播可能にした構造

    • 大きな改善効果はなかった。
  • 課題: LSTMでは、パラメータ数が多く、計算負荷が高くなる問題があった。

GRU

従来のLSTMでは、パラメータが多数存在していたため、計算負荷が大きかった。 しかし、GRUでは、そのパラメータを大幅に削減し、精度は同等またはそれ以上が望めるようになった構造。

  • リセットゲート
  • 更新ゲート

双方向RNN

過去の情報だけでなく、未来の情報を加味することで、精度を向上させるためのモデル

RNNでの自然言語処理

Seq2Seq

  • Encoder-Decoderモデルの一種
  • 2つのRNNで作成されている。

    • エンコーダー: 単語が入力されるRNN→文脈
    • デコーダー: 出力を生成するRNNへ
  • 機械翻訳で使用されている
  • 構成

    • Ecoder-RNN: ユーザーがインプットしたテキストデータを、単語等のトークンに区切って渡す構造
    • Taking: 文章を単語等のトークン毎に分割し、トークンごとのIDに分割する
    • Embedding: IDから、そのトークンを表す分散表現ベクトルに変換。単語の意味を抽出したベクトルを作る
    • Encoder RNN: ベクトルを順番にRNNに入力していく。
    • ベクトルを逐次RNNに入力し、hidden stateを更新していく。最後のベクトルを入力した時のhidden stateをfinal stateとしてとっておく。

      • 入力した文の意味を表すベクトルとなる。
    • Decoder-RNN: システムがアウトプットデータを、単語等のトークンごとに生成する構造
    • 1.Decoder-RNN: Encoder-RNNのfinal stateから、各トークンの生成確率を出力していきます。final stateをDecoder RNNのinitial stateとして設定し、Embeddingを入力
    • 2.Sampling: 生成確率に基づいてtokenをランダムに選びます。
    • 3.Embedding: 2で選ばれたtokenをEmbeddingしてDecoder RNNへの次に入力とします。
    • 4.Detokenize: 1-3を繰り返し、2で得られたtokenを文字列に直します。
  • 課題

    • 一問一答しかできない
  • MLM(Masked Language Model):
  • HRED: 過去n-1個の発話から次の発話を生成する。

    • Seq2Seq + Context RNN
    • Context RNN: Encoderのまとめた各文章の系列をまとめて、これまでの会話コンテキスト全体を表すベクトルに変換する構造
    • 課題
    • 確率的な多様性が字面にしかなく、会話の「流れ」のような多様性はない。
    • 短く情報量に乏しい答えをしがちである。
  • VHRED: HREDに、VAEの潜在変数の概念を追加したもの。
  • オートエンコーダ:

    • 教師なし学習の一つ。
    • 構造
    • 入力データから潜在変数zに変換するニューラルネットワークをEncoder
    • 逆に潜在変数zをインプットとして元画像を復元するニューラルネットワークをDecoder
  • VAE: VAEは、データを潜在変数zの確率分布という構造に押し込めることを可能にする

    • 通常のオートエンコーダーの場合、何かしら潜在変数zにデータを押し込めているものの、その構造がどのような状態かわからない。
    • VAEはこの潜在変数zに確率分布を仮定したもの。

word2vec

単語をベクトル表現する手法

Attention Mechanism

seq2seqの問題は長い文章への対応が難しいです。 seq2seqでは、2単語でも、100単語でも、固定次元ベクトルの中に入力しなければならない。 そのため、文章が長くなるほどそのシーケンスの内部表現の次元も大きくなっていく、仕組みが必要になります。 「入力と出力のどの単語が関連しているのか」の関連度を学習する仕組み

転移学習

目的: 深層学習モデルの獲得 深層学習モデルの構成

  • 特徴料抽出(ベースモデル)

    • 学習コスト: 高
    • 必要なデータ: 大量
  • タスク固有処理

    • 学習コスト: 低
    • 必要なデータ: 少量 ゼロベースの学習はコストが高いので、使いまわせるように特徴量抽出の学習とタスク固有処理の分ける。 プリトレーニング: 教師なし学習で特徴量抽出器を作る
  • ファインチューニング: ベースモデルの重みを再学習し、タスク固有処理の部分も学習する
  • 転移学習: ベースモデルの重みを固定にして利用し、タスク固有処理の部分だけ学習する。

勾配消失問題

誤差逆伝播法が下位層に進んでいくに連れて、勾配がどんどん緩やかになっていく。 そのため、勾配降下法による、更新では下位層のパラメータはほとんど変わらず、訓練は最適値に収束しなくなる。

  • シグモイド関数: 微分後の値がたかだか0.25にしかならない。層増えると下位層で0に近づいてしまう。 勾配消失の解決法
  • 活性化関数の選択

    • ReLU関数の利用: 勾配消失問題の回避とスパース化に貢献することで良い成果をもたらしている。
  • 重みの初期値設定: 基本は正規分布をもとに設定する

    • Xavier(ザビエル): 重みの要素を、前の層のノード数の平方根で除算した値を設定する
    • S字カーブな活性化関数に対してうまく働く。
    • He: 重みの要素を、前の層のノード数の平方根で除算した値に対し√2を掛け合わせた値
  • バッチ正規化: ミニバッチ単位で、入力値のデータの偏りを抑制する手法

    • 使い所: 活性化関数に渡す前後に、バッチ正規化の処理を孕んだ層を加える。
    • ミニバッチサイズは、2の倍数を設定することが多い
    • 例: 画像の場合
    • ミニバッチのサイズは機材によって変化する

      • CPU:
      • GPU: 1~64枚
      • TPU: 1~256枚

重みの初期値に0を設定するとどのような問題が発生するか? 重みを0で初期化すると正しい学習が行えない。 すべての重みの値が均一に更新されるため、多数の重みを持つ意味がなくなる。

学習率の最適化手法

学習率の値が大きい場合、最適値にいつまでもたどり着かず発散してしまう。 学習率の値が小さい場合、発散することはないが、小さすぎると収束するまでに時間がかかってしまう。大域局所最適値に収束しづらくなる。

  • モメンタム: 誤差をパラメータで微分したものと学習率の積を減算した値と慣性の積を加算する

    • 移動平均に近い動きをする
  • AdaGrad: 誤差をパラメータで微分したものと再定義した学習率の積を減算する。

    • メリット: 勾配の緩やかな斜面に対して、最適値に近づける
    • 課題: 学習率が徐々に小さくなるので、鞍点問題を引き起こすことがあった。
  • RMSProp: 誤差をパラメータで微分したものと再定義した学習率の積を減算する。

    • メリット: 局所的最適解にならず、大域的最適解となる。ハイパーパラメータの調整が必要な場合が少ない。
  • Adam: モメンタムの、過去の勾配の指数関数的減衰平均。RMSPropの、過去の勾配の二乗の指数関数的減衰平均をそれぞれ孕んだ最適化アルゴリズム

    • メリット: モメンタム及びRMSPropのメリットを孕んだアルゴリズム

マルチタスク学習

複数の問題を単一のモデルでまとめて解く手法。アンサンブル学習も同様 対比される学習手法としてシングルタスク学習があります。

  • マルチタスク学習の仕組み

    • 共有層
    • タスク固有層
  • メリット

    • モデル数が少なくて済む
    • 各タスクの相乗効果により、それぞれのタスクで性能向上が期待できる
    • 学習時間や総パラメータ数を減らせる
  • 注意点

    • 単一のタスクだけに着目するとより多くのメモリ・演算量が必要
    • 学習の難易度が高い

バギング

並列に複数の学習器を構築し、それぞれの学習器の結果を用いて総合的な出力結果を求める手法

  • 回帰の場合: 出力結果は平均値
  • 分類の場合: 出力結果は多数決 メリット
  • データの一部を訓練データとして使うことで、バリアンすを押させることができ、それにより過学習を抑えることができる
  • それぞれ並列で計算できるため、処理時間が抑えることができる 注意点
  • データを使いすぎるとバリアンスが高くなり、過学習の原因となる
  • 訓練データが似通った特徴の場合、テストデータによる検証時に精度向上が期待できない場合がある。 ランダムフォレスト: バギングと決定機を組み合わせた手法

ブースティング

直列的に学習する メリット

  • 一つ前の学習器で生成したデータを再利用するため、バギングより精度向上が期待できる デメリット
  • バリアンスが高くなりやすく、過学習が起こりやすい

スタッキング

さまざまなアルゴリズムを使用して精度を上げる手法 メリット

  • 様々な計算方法を目的に合わせて使用できるので、精度が上がりやすくなる 注意点
  • 様々な計算方法を目的に合わせて使用する必要があるため、手間がかかる。

「ラビットチャレンジ Stage 3 〜深層学習:前編〜」に出てくるキーワード

  • ベイズの定理
  • 生起確率
  • 決定的な識別/確率的な識別
  • 万能近似定理
  • 活性化関数